// #pragma once

// // mysql版本
// #include "../comm/util.hpp"
// #include "../comm/log.hpp"

// #include <iostream>
// #include <string>
// #include <cassert>
// #include <vector>
// #include <unordered_map>
// #include <fstream>
// #include "include/mysql.h"

// // 根据题目list文件，加载所有的题目信息到内存中
// // model: 主要用来和数据进行交互，对外提供访问数据的接口

// namespace ns_model
// {
//     using namespace std;
//     using namespace ns_log;
//     using namespace ns_util;
//     struct Question
//     {
//         std::string number; // 题目编号，唯一
//         std::string title;  // 题目的标题
//         std::string star;   // 难度: 简单 中等 困难
//         std::string desc;   // 题目的描述
//         std::string header; // 题目预设给用户在线编辑器的代码
//         std::string tail;   // 题目的测试用例，需要和header拼接，形成完整代码
//         int cpu_limit;      // 题目的时间要求(S)
//         int mem_limit;      // 题目的空间要去(KB)
//     };

//     // const std::string questions_list = "./questions/questions.list";
//     // const std::string questions_path = "./questions";

    
//     const std::string oj_questions = "oj_questions";
//     const std::string host = "127.0.0.1";
//     const std::string user = "oj_client";
//     const std::string passwd = "123456";
//     const std::string db = "oj";
//     const int port = 3306;
//     class Model
//     {
//     private:
//         // //题号：题目细节
//         // unordered_map<string, Question> questions;
//     public:
//         Model()
//         {
//             // assert(LoadQuestionList(questions_list));
//         }
//         // bool LoadQuestionList(const string &question_list)
//         // {
//         //     //加载配置文件: questions/questions.list + 题目编号文件
//         //     ifstream in(question_list);
//         //     if(!in.is_open())
//         //     {
//         //         LOG(FATAL) << " 加载题库失败,请检查是否存在题库文件" << "\n";
//         //         return false;
//         //     }
//         //     string line;
//         //     while(getline(in, line))
//         //     {
//         //         vector<string> tokens;
//         //         StringUtil::SplitString(line, &tokens, " ");
//         //         // 1 判断回文数 简单 1 30000
//         //         if(tokens.size() != 5)
//         //         {
//         //             LOG(WARNING) << "加载部分题目失败, 请检查文件格式" << "\n";
//         //             continue;
//         //         }
//         //         Question q;
//         //         q.number = tokens[0];
//         //         q.title = tokens[1];
//         //         q.star = tokens[2];
//         //         q.cpu_limit = atoi(tokens[3].c_str());
//         //         q.mem_limit = atoi(tokens[4].c_str());

//         //         string path = questions_path;
//         //         path += q.number;
//         //         path += "/";

//         //         FileUtil::ReadFile(path+"desc.txt", &(q.desc), true);
//         //         FileUtil::ReadFile(path+"header.cpp", &(q.header), true);
//         //         FileUtil::ReadFile(path+"tail.cpp", &(q.tail), true);

//         //          questions.insert({q.number, q});
//         //     }
//         //     LOG(INFO) << "加载题库...成功!" << "\n";
//         //     in.close();

//         //     return true;
//         // }

//         bool QueryMySql(const std::string &sql, vector<Question> *out)
//         {
//              // 创建mysql句柄
//             MYSQL *my = mysql_init(nullptr);

//             // 连接数据库
//             if(nullptr == mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(),db.c_str(),port, nullptr, 0)){
//                 LOG(FATAL) << "连接数据库失败!" << "\n";
//                 return false;
//             }

//             // 一定要设置该链接的编码格式, 要不然会出现乱码问题
//             mysql_set_character_set(my, "utf8");

//             LOG(INFO) << "连接数据库成功!" << "\n";

//             // 执行sql语句
//             if(0 != mysql_query(my, sql.c_str()))
//             {
//                 LOG(WARNING) << sql << " execute error!" << "\n";
//                 return false;
//             }

//             // 提取结果
//             MYSQL_RES *res = mysql_store_result(my);

//             // 分析结果
//             int rows = mysql_num_rows(res); //获得行数量
//             int cols = mysql_num_fields(res); //获得列数量

//             Question q;

//             for(int i = 0; i < rows; i++)
//             {
//                 MYSQL_ROW row = mysql_fetch_row(res);
//                 q.number = row[0];
//                 q.title = row[1];
//                 q.star = row[2];
//                 q.desc = row[3];
//                 q.header = row[4];
//                 q.tail = row[5];
//                 q.cpu_limit = atoi(row[6]);
//                 q.mem_limit = atoi(row[7]);

//                 out->push_back(q);
//             }
//             // 释放结果空间
//             free(res);
//             // 关闭mysql连接
//             mysql_close(my);

//             return true;
//         }
//         bool GetAllQuestions(vector<Question> *out)
//         {
//             std::string sql = "select * from ";
//             sql += oj_questions;
//             return QueryMySql(sql, out);
//             //  if(questions.size() == 0)
//             // {
//             //     LOG(ERROR) << "用户获取题库失败" << "\n";
//             //     return false;
//             // }
//             // for(const auto &q : questions){
//             //     out->push_back(q.second); //first: key, second: value
//             // }

//             // return true;
//         }
//         bool GetOneQuestion(const std::string &number, Question *q)
//         {

//             bool res = false;
//             std::string sql = "select * from ";
//             sql += oj_questions;
//             sql += " where number=";
//             sql += number;
//             vector<Question> result;
//             if (QueryMySql(sql, &result))
//             {
//                 if (result.size() == 1)
//                 {
//                     *q = result[0];
//                     res = true;
//                 }
//             }
//             return res;
//             //    const auto& iter = questions.find(number);
//             //     if(iter == questions.end()){
//             //         LOG(ERROR) << "用户获取题目失败, 题目编号: " << number << "\n";
//             //         return false;
//             //     }
//             //     (*q) = iter->second;
//             //     return true;
//         }
//         ~Model()
//         {
//         }
//     };
// } // namespace ns_model